package tp.controller;

/*Controlador es la clase que maneja la cantidad de cosas que hay en el tablero
 de juego y el putaje del jugador para cuando termine el juego*/

import java.util.*;
import tp.controller.parserXML.EscritorXMLPuntaje;
import tp.controller.parserXML.Puntaje;
import tp.model.*;
import tp.view.*;
import tp.view.CopyOfBoardView1.ComparadorPuntajes;
import tp.mains.*;

/**
 * @author Dr Von Nostrum 05/10/2006 1.1 version con ColChocables
 * 
 */

public class Controlador {
	public ColChocables ListaChocables;

	public static boolean Corriendo;

	private static int Puntaje;

	public static boolean Pausa;

	public static int CantBolas = 1;

	public static int CantNave;

	public static int velBola = 8;

	public static int velNave = 8;

	public static SpriteCache spriteCache;

	public static boolean GameOver = false;

	public static boolean finNiveles = false;

	public static Posicion posNaveInicial = new Posicion(250, 65);

	public static Controlador controlador;

	public static Nave nave;

	public static int nivel = 0;

	public static String Jugador;

	public static Posicion posbd = new Posicion(420, 0);

	public static Posicion posbi = new Posicion(60, 0);

	public static Posicion posTop = new Posicion(60, 640);

	public static Posicion posBottom = new Posicion(0, 50);

	public static Posicion dirDer = new Posicion(-1, 0);// es la normal

	public static Posicion dirIzq = new Posicion(1, 0);

	public static Posicion dirSup = new Posicion(0, -1);

	public static Posicion dirInf = new Posicion(1, 0);

	public static int getCantNave() {
		return CantNave;
	}

	public Controlador() {
		controlador = this;
		controlador.newListaChoc();
		spriteCache = new SpriteCache();
		// podria aca cargar el nivel efault, que puede estar en un archivo etc
		setPausa(false);
	}

	public static void incrementarNivel() {
		nivel = nivel + 1;
	}

	public static void setCantNave(int cantNave) {
		CantNave = cantNave;
	}

	public static int getCantBolas() {
		return CantBolas;
	}

	public static void setCantBolas(int cantBolas) {
		CantBolas = cantBolas;

	}

	public static void restarCantBolas() {
		int canBolas = Controlador.getCantBolas() - 1;
		setCantBolas(canBolas);
		if (canBolas <= 0) {
			restarCantNaves();// setCantNave((Controlador.CantNave) - 1);
		}
	}

	private static void restarCantNaves() {
		int canti = CantNave;
		if (canti >= 1) {
			CantNave -= 1;
			nave.setMiPosicion(posNaveInicial);
			nave.revertirPoderes();			
			nave.setBola(new Bola());
			CantBolas = 1;
			/*Iterator it = controlador.ListaChocables.iterator();
			while ((!encontrado) && it.hasNext()) {
				Chocable c = (Chocable) it.next();
				if (c.getClase() == "Nave") {
					c.setMiPosicion(posNaveInicial);
					((Nave) c).revertirPoderes();
					((Nave) c).setBola(new Bola());
					// Posicion posBol = ((Nave)c).getMiPosicion();
					// posBol.sumarPosicionY(((Nave)c).getMiAltura()/2);
					// ((Nave)c).getBola().setMiPosicion(posBol);
					CantBolas = 1;
					encontrado = true;
				}
			}*/
		
		} else {
			// TODO fijarse que va aca!!!
			// TODO LLAMAR A CARTEL DE GAME OVER
			GameOver = true;
			escribirXML();
			// GameOverView GameOver = new GameOverView();
			// GameOver.getHeight();
		}
	}

	public static void setPuntaje(int Puntos) {
		Puntaje += Puntos;
	}

	/**
	 * @return the puntaje
	 */
	public static int getPuntaje() {
		return Puntaje;
	}

	/**
	 * @return the listaChocables
	 */
	public ColChocables getListaChocables() {
		return ListaChocables;
	}

	/**
	 * @Do agrega un elemento a la lista de chocables
	 */
	public void addChocable(Chocable choc) {
		ListaChocables.add(choc);
	}

	/**
	 * @param chocable,
	 *            sino no hace nada ademas devuelve el elemento en la coleccion
	 *            que tenga la misma referencia es decir elimina el elemento
	 *            pasado por parametro
	 */
	public void delChocable(Chocable choc) {
		ListaChocables.remove(choc);
	}

	/**
	 * crea la lista de chocables
	 */
	public void newListaChoc() {
		this.ListaChocables = new ColChocables();
	}

	public boolean recorrerLista() {
		boolean noHayLadrillos = true;
		Iterator<Chocable> it = this.ListaChocables.iterator();
		int i = 0;
		while ((it.hasNext())) {
			Chocable elem = (Chocable) it.next();
			if (elem.getClase().equalsIgnoreCase("Ladrillo")) {
				noHayLadrillos = false;
			}
			if (elem.isVivo() == false) {
				this.ListaChocables.remove(i);// elem cambiado por i
				i--;
			} else {
				Posicion posi = elem.hago();
				nave.hago();
			}
			i++;
		}
		return noHayLadrillos;
	}

	/**
	 * @return devuelve el estado de la pausa en el juego
	 */
	public static boolean isPausa() {
		return Pausa;
	}

	/**
	 * @param b,
	 *            setea el valor del juego
	 */
	public static void setPausa(boolean b) {
		Pausa = b;
	}

	/**
	 * Aqui esta funcion, nos dice que es lo que tiene que hacer el juego con
	 * dos condiciones una si esta en pausa, y otra si es que ha terminado el
	 * nivel busca un nivel nuevo
	 * 
	 */
	public void funcionar() {
		if ((Corriendo) && (!GameOver)) {
			if (!Pausa) {
				if (!(CantBolas <= 0)) {
					if (recorrerLista()) { // si se quedo sin ladrillos
						setCorriendo(false);
						Controlador.controlador.nave.revertirPoderes();
						nave = null;
						Controlador.controlador.CantBolas = 1;
						nivelSiguiente();
					}// falta restar vidas y ver quue onda con reiniciar el
						// puesto en la nave
				} else {
					Corriendo = false;
					restarCantNaves();
					if (CantNave < 0) {
					}
				}
			}
		}
	}

	public static void escribirXML() {
		CopyOfBoardView1.ListaPuntajes.add(new Puntaje(Puntaje, Jugador));
		// CopyOfBoardView1.ListaPuntajes.add(new Puntaje(Puntaje,"carlitos2"));
		ComparadorPuntajes comp = CopyOfBoardView1.panel.new ComparadorPuntajes();
		Collections.sort(CopyOfBoardView1.ListaPuntajes, comp);
		EscritorXMLPuntaje XMLWriter = new EscritorXMLPuntaje();
		XMLWriter.escribir();
	}

	public static void nivelSiguiente() {
		incrementarNivel();
		CargaNiveles carga = new CargaNiveles();
		if (nivel == 1) {
			carga.creonivel();
			setCorriendo(true);

		}
		if (nivel == 2) {
			carga.creonivel();
			setCorriendo(true);
		}
		if (nivel == 3) {
			finNiveles = true;
			escribirXML();
			setCorriendo(false);
		}
	}

	public static boolean isCorriendo() {
		return Corriendo;
	}

	public static void setCorriendo(boolean corriendo) {
		Corriendo = corriendo;
	}

	public static void crearNucleo(Nucleo nucleo) {
		nucleo.setListaChocables(controlador.ListaChocables);
		controlador.addChocable(nucleo);
	}

	public static Nave getNave() {
		return nave;
	}

	public static void setNave(Nave miNave) {
		nave = miNave;
	}

	public int getnivel() {
		return nivel;
	}
}
